package com.login.sotoken.controller.user;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.SaTerminalInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.login.sotoken.common.AjaxJson;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description
 * @Author xiaohuang
 * @Date 2025/8/15
 */
@Slf4j
@SaCheckLogin
@Tag(name = "会话管理", description = "会话管理接口")
@RestController
@RequestMapping("/session")
public class SessionController {

    /**
     * 获取某账号的登录信息
     */
    @Operation(summary = "获取指定账号已登录终端列表信息")
    @GetMapping("terminalList ")
    public AjaxJson terminalList(@Schema(description = "用户名")@RequestParam(name = "userName")String userName) {
        List<SaTerminalInfo> list = StpUtil.getTerminalListByLoginId(userName);
        // 获取所有已登录的会话id
        List<String> sessionIdList = StpUtil.searchSessionId("", 0, -1, false);
        for (String sessionId : sessionIdList) {
            // 根据会话id，查询对应的 SaSession 对象，此处一个 SaSession 对象即代表一个登录的账号
            SaSession session = StpUtil.getSessionBySessionId(sessionId);
            // 查询这个账号都在哪些设备登录了，依据上面的示例，账号A 的 SaTerminalInfo 数量是 3，账号B 的 SaTerminalInfo 数量是 2
            List<SaTerminalInfo> terminalList = session.terminalListCopy();
            log.info("会话id：" + sessionId + "，共在 " + terminalList.size() + " 设备登录");
        }
        return AjaxJson.getSuccessData(list);
    }
    /**
     * 获取某账号的登录信息
     */
    @Operation(summary = "查询所有登录账号的会话信息")
    @GetMapping("all")
    public AjaxJson all() {
        // 获取所有已登录的会话id
        List<String> sessionIdList = StpUtil.searchSessionId("", 0, -1, false);
        List<SaTerminalInfo> list=new ArrayList<>();
        for (String sessionId : sessionIdList) {
            // 根据会话id，查询对应的 SaSession 对象，此处一个 SaSession 对象即代表一个登录的账号
            SaSession session = StpUtil.getSessionBySessionId(sessionId);
            // 查询这个账号都在哪些设备登录了，依据上面的示例，账号A 的 SaTerminalInfo 数量是 3，账号B 的 SaTerminalInfo 数量是 2
            List<SaTerminalInfo> terminalList = session.terminalListCopy();
            list.addAll(terminalList);
            log.info("会话id：" + sessionId + "，共在 " + terminalList.size() + " 设备登录");
        }
        return AjaxJson.getSuccessData(list);
    }
}
